package com.billdowney.websocket;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

/**
 * WebSocketServer服务，待优化
 * 
 * @author: 唐路钧
 * @date: 2019年1月10日 下午4:21:06
 */
@ServerEndpoint("/websocket/{userId}")
@Component
public class WebSocketServer {

	private static Map<String, WebSocketServer> userSessions = new ConcurrentHashMap<>();

	// 与某个客户端的连接会话，需要通过它来给客户端发送数据
	private Session session;
	// 用户id
	private String userId;

	/**
	 * 连接建立成功调用的方法
	 * 
	 * @param session 客户端session
	 * @param userId  用户id
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午2:55:56
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("userId") String userId) {
		this.session = session;
		this.userId = userId;
		userSessions.put(userId, this);
		System.out.println("有新窗口开始监听:" + userId + ",当前在线人数为：" + getOnlineCount());
		try {
			sendMessage("连接成功");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 连接关闭调用的方法
	 * 
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午2:58:35
	 */
	@OnClose
	public void onClose() {
		userSessions.remove(userId);
		System.out.println("有一连接关闭！当前在线人数为：" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 * 
	 * @param message
	 * @param session
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午3:00:33
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		System.out.println("收到来自窗口" + userId + "的信息:" + message);
	}

	/**
	 * 发生错误调用的方法
	 * 
	 * @param session
	 * @param error
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午3:00:58
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		System.out.println("发生错误：" + userId);
		error.printStackTrace();
	}

	/**
	 * 实现服务器主动推送
	 * 
	 * @param message
	 * @throws IOException
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午3:01:18
	 */
	public void sendMessage(String message) throws IOException {
		this.session.getBasicRemote().sendText(message);
	}

	public static synchronized int getOnlineCount() {
		return userSessions.size();
	}

}
